package aedustuff;


/**
 * Die ForUnderstandingStart Klasse zeigt auf, wie das MainCardDeck und das
 * GameFieldCardDeck genutzt werden können. (Anstatt in dieser Klasse, können
 * die KartenDecks auch in einer GUI Klasse instanziert und genutzt werden.) Das
 * MainCardDeck ist das ursprüngliche Kartendeck, von dem Karten genommen
 * werden, bis das Spiel beendet wird. Das GameFieldCardDeck wird in diesem
 * Spiel 4 mal instanziert, und kann bis zu 3 Karten aufnehmen, die in der Mitte
 * des Spielfeldes gesehen werden.
 *
 * @author Adrian Hostettler
 */
public class ForUnderstandingStart {

    MainCardDeck mainCardDeck;
    GameFieldCardDeck cardDeck1;
    GameFieldCardDeck cardDeck2;
    GameFieldCardDeck cardDeck3;
    GameFieldCardDeck cardDeck4;
    Gui gui;

    public ForUnderstandingStart() {
        /**
         * Ein MainCardDeck und 4 GameFieldCardDecks werden initialisiert.
         */
        mainCardDeck = new MainCardDeck();
        cardDeck1 = new GameFieldCardDeck();
        cardDeck2 = new GameFieldCardDeck();
        cardDeck3 = new GameFieldCardDeck();
        cardDeck4 = new GameFieldCardDeck();
    }

    public void run() {

        /**
         * Die Inhalte der Kartendecks werden in der Konsole ausgegeben, gleich
         * nach der Initialisierung, um zu sehen, wie die Decks initialisiert
         * wurden. (Die Farben im mainCardDeck sind bei jeder Ausführung anders
         * angeordnet.)
         */
        showAllCardDecks();
        /**
         * Zur optischen Unterscheidung von vorher/nachher Zustand der
         * Kartenstapel.
         */
        System.out.println("------------------------");
        /**
         * Den Kartendecks werden Karten vom Hauptstapel übergeben.
         */
        cardDeck1.addCardFrom(mainCardDeck);
        cardDeck1.addCardFrom(mainCardDeck);

        cardDeck2.addCardFrom(mainCardDeck);
        /**
         *
         * Zum Versändnis: Zuerst werden dem Kartendeck 4 zwei Karten
         * zugewiesen,
         */
        cardDeck4.addCardFrom(mainCardDeck);
        cardDeck4.addCardFrom(mainCardDeck);
        /**
         * und dann erst dem Kartendeck 3.
         */
        cardDeck3.addCardFrom(mainCardDeck);
        cardDeck3.addCardFrom(mainCardDeck);
        cardDeck3.addCardFrom(mainCardDeck);
        /**
         * Die 4. und 5. Zuweisung beim Kartendeck 3 werden ignoriert, da der
         * Stapel schon voll ist. (siehe addCardFrom()-Methode)
         */
        cardDeck3.addCardFrom(mainCardDeck);
        cardDeck3.addCardFrom(mainCardDeck);
        /**
         * Die Inhalte der Kartendecks werden nach der Kartenverteilung wieder
         * ausgegeben.
         */
        showAllCardDecks();
    }

    /**
     * Diese Methode zeigt den Inhalt des übergebenen Kartendecks auf der
     * Konsole an.
     *
     * @param cd Das CardDeck, das auf der Konsole ausgegeben werden soll.
     */
    private void showCardDeck(ICardDeck cd) {
        System.out.print(cd.toString());
    }

    private void showAllCardDecks() {
        showCardDeck(mainCardDeck);
        showCardDeck(cardDeck1);
        showCardDeck(cardDeck2);
        showCardDeck(cardDeck3);
        showCardDeck(cardDeck4);
    }
}
